package utilitaire;

import gtrnadb.GeneStructure;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.util.ArrayList;
import java.util.List;
 

public class GenererExcel {
 
	//chemin de stockage pour le fichier
	public String repertoireFichier =  System.getProperty("user.dir");
	List<String> enTete = new ArrayList<String>();
	MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
	InputStream inp;
	String nomFichier = "Projet_M1ILC_2011";
	String auteur1 = "BuchlerGeoffroy";
	String auteur2 = "MullerFlorent";
	
	
	/**
	 * Cr�er le fichier excel
	 */
	public GenererExcel() {
		
	}
	
	public ArrayList<GeneStructure> readExcel(File file) {
		ArrayList<GeneStructure> listGeneStructure = new ArrayList<GeneStructure>();
		try {
			FileReader fileReader;
			if(file == null)
				fileReader = new FileReader(nomFichier+"_"+auteur1+"_"+auteur2+".csv");
			else
				fileReader = new FileReader(file);
			BufferedReader bufferReader = new BufferedReader(fileReader);			
			String chaine;
			   int i = 1;
			   while((chaine = bufferReader.readLine())!= null)
			   {
			      if(i > 1)
			      {
			         String[] tabChaine = chaine.split(";");
			         if (tabChaine.length==8) {
			        	 listGeneStructure.add(new GeneStructure(tabChaine[0], tabChaine[1], tabChaine[2], tabChaine[3], tabChaine[4], tabChaine[5], tabChaine[6], tabChaine[7]));
			         }
			         //Tu effectues tes traitements avec les données contenues dans le tableau
			         //La première information se trouve à l'indice 0
			      }	
			      i++;
			   }
			   bufferReader.close();
			   fileReader.close();
		} catch(Exception exception) {
			System.err.println(exception);
		}
		return listGeneStructure;
	}
	
	public void writeExcel(ArrayList<GeneStructure> listGeneStructure) {
		try
		{
			System.out.println("Repertoire : "+repertoireFichier);
			System.out.println("Mémoire utilisée : " +memoryBean.getHeapMemoryUsage());
			System.out.println("Longueur de la liste : " + listGeneStructure.size());
			
			StringBuilder resultat = this.genererEnTete(enTete);

			for(Long i = (long)0; i < listGeneStructure.size();i++) {

				resultat = this.remplirExcel(resultat, listGeneStructure.get(i.intValue()));
	
			}
			FileWriter fileOut = new FileWriter(nomFichier+"_"+auteur1+"_"+auteur2+".csv");
			fileOut.write(resultat.toString());

			fileOut.close();
			System.out.println("Mémoire utilisée : " +memoryBean.getHeapMemoryUsage());
			System.out.println("Fichier créé");
		} catch(Exception exception) {
			System.out.println("Mémoire utilisée : " +memoryBean.getHeapMemoryUsage());
			System.out.println("Erreur à la création : " + exception.getMessage());
		}
	}
	
	/**
	 * Initialise les noms de l'en-t�te
	 */
	public void initialiserEnTete() {
		enTete.add("Name");
		enTete.add("Length");
		enTete.add("Type");
		enTete.add("Anticodon");
		enTete.add("PositionStart");
		enTete.add("PositionEnd");
		enTete.add("Sequence");
		enTete.add("Str");
	}

	
	public StringBuilder genererEnTete(List<String> enTete) {
		initialiserEnTete();
		
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0; i < enTete.size(); i++) {
			sb.append(enTete.get(i)).append(";");
		}
		sb.append("\n");
		return sb;
		
	}
	
	

	/**
	 * Remplit le fichier excel avec la liste des g�nes
	 * @param sheet
	 * @param listGeneStructure
	 * @return
	 */
	public StringBuilder remplirExcel(StringBuilder stringBuilder, GeneStructure geneStructure) throws Exception{
			
			//la longueur d'une cellule est limit�e � 255 caract�res
			if(geneStructure.getName() != null) {
				if(geneStructure.getName().length() < 255) {
					stringBuilder.append(geneStructure.getName()).append(";");
				}
				else {
					//System.out.println("Item de la liste n� : " + i.toString());
					System.out.println("Erreur - Nom trop long : " + geneStructure.getName());
				}
			}
			else {
				//System.out.println("Item de la liste n� : " + i.toString());
				System.out.println("Erreur - Nom null ");
			}
				
			
			if(geneStructure.getLength() != null) {
				if(geneStructure.getLength().length() < 255) {
					stringBuilder.append(Integer.parseInt(geneStructure.getLength())).append(";");
				}
				else {
					//System.out.println("Item de la liste n° : " + i.toString());
					System.out.println("Erreur - Longueur trop longue : " + geneStructure.getLength());
				}
			}
			else {
				//System.out.println("Item de la liste n� : " + i.toString());
				System.out.println("Erreur - Longueur null ");
			}
			
			if(geneStructure.getType() != null) {
				if(geneStructure.getType().length() < 255) {
					stringBuilder.append(geneStructure.getType()).append(";");
				}
				else {
					//System.out.println("Item de la liste n° : " + i.toString());
					System.out.println("Erreur - Type trop long : " + geneStructure.getType());
				}
			}
			else {
				//System.out.println("Item de la liste n° : " + i.toString());
				System.out.println("Erreur - Type null ");
			}
			
			if(geneStructure.getAnticodon() != null) {
				if(geneStructure.getAnticodon().length() < 255) {				
					stringBuilder.append(geneStructure.getAnticodon()).append(";");
				}
				else {
					//System.out.println("Item de la liste n° : " + i.toString());
					System.out.println("Erreur - Anticodon trop long : " + geneStructure.getAnticodon());
				}
			}
			else {
				//System.out.println("Item de la liste n° : " + i.toString());
				System.out.println("Erreur - Anticodon null ");
			}
			
			if(geneStructure.getPositionStart() != null) {
				if(geneStructure.getPositionStart().length() < 255) {
					stringBuilder.append(Integer.parseInt(geneStructure.getPositionStart())).append(";");
				}
				else {
					//System.out.println("Item de la liste n� : " + i.toString());
					System.out.println("Erreur - PositionStart trop longue : " + geneStructure.getPositionStart());
				}
			}
			else {
				//System.out.println("Item de la liste n� : " + i.toString());
				System.out.println("Erreur - PositionStart null ");
			}
			
			if(geneStructure.getPositionEnd() != null) {
				if(geneStructure.getPositionEnd().length() < 255) {
					stringBuilder.append(Integer.parseInt(geneStructure.getPositionEnd())).append(";");
				}
				else {
					//System.out.println("Item de la liste n� : " + i.toString());
					System.out.println("Erreur - PositionEnd trop longue : " + geneStructure.getPositionEnd());
				}
			}
			else {
				//System.out.println("Item de la liste n� : " + i.toString());
				System.out.println("Erreur - PositionEnd null ");
			}
			
			if(geneStructure.getSeq() != null) {
				if(geneStructure.getSeq().length() < 255) {
					stringBuilder.append(geneStructure.getSeq()).append(";");
				}
				else {
					//System.out.println("Item de la liste n� : " + i.toString());
					System.out.println("Erreur - Sequence trop longue : " + geneStructure.getSeq());
				}
			}
			else {
				//System.out.println("Item de la liste n� : " + i.toString());
				System.out.println("Erreur - Séquence null ");
			}
			
			if(geneStructure.getStr() != null) {
				if(geneStructure.getStr().length() < 255) {
					stringBuilder.append(geneStructure.getStr()).append(";");
				}
				else {
					//System.out.println("Item de la liste n� : " + i.toString());
					System.out.println("Erreur -  Str trop longue : " + geneStructure.getStr());
				}
			}
			else {
				//System.out.println("Item de la liste n� : " + i.toString());
				System.out.println("Erreur - Str null ");
			}
		stringBuilder.append("\n");
		return stringBuilder;
	}
	
}
